home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Diamond Collection
/
The Diamond Collection (Software Vault)(Digital Impact).ISO
/
cdr47
/
asmlib40.zip
/
DISK.DOC
< prev
next >
Wrap
Text File
|
1995-02-09
|
29KB
|
1,001 lines
***************************** DISK & FILE *******************************
ASMLIB disk & file subroutines (C) Copyright 1992 - 1995 Douglas Herr
All rights reserved
The MS-DOS file attribute byte tells you whether a file is read-only,
system, a subdirectory, or may provide other information. File attribute
bits may be combined. Each bit of the file attribute means:
0 = normal files
1 = read-only
2 = hidden files
4 = system files
8 = volume label (only one per disk)
16 = subdirectories
32 = archive bit set
Thus a file with an attribute of 18 is a hidden subdirectory (16 OR 2)
ASMLIB buffered file I/O system
Several ASMLIB subroutines are available for buffered file Input or
Output. Files to be managed by the buffered I/O system must be opened
by FOPEN or FCREATE, and must be closed by FCLOSE. Buffered file I/O
will be much faster than unbuffered. ASMLIB's default buffer size is
4096 bytes; this can be changed by altering FBUFFER_SIZE in FOPEN.ASM
and re-assembling. Up to 20 files can be managed by FOPEN; this can
be changed by altering NUMBER_OF_FILES in $handle.asm and reassembling.
All ASMLIB file buffer subroutines assume DS:@data.
To use the ASMLIB buffered I/O system excess DOS memory must be
released. See ENDPROG in SYSTEM.DOC.
Subroutines: FOPEN open file & initialize buffer
FCREATE create file & initialize buffer
FCLOSE flush & close output buffer; close file
FSEEK move file pointer & update buffer
FGET read specified number of bytes from buffer
FGETCHR read a character from buffer
FGETPOS get file pointer position
FGETSTR read a string from buffer
FGETSTRR read previous string from buffer
FPUTSTR write string to buffer
FPUTCRLF write CR+LF to buffer
FPUTCHR write character to buffer
FPUT write specified number of bytes to buffer
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
DISKFREE: determines free disk space
Source: diskfree.asm
Call with: DL = drive number (drive A: = 0, default drive = -1)
Returns: if CF = 0, DX:AX = free disk space
if CF = 1, AX = DOS error code
DiskFree does not trap "drive not ready" errors
Uses: DX, AX, flags
Supports: all DOS drives
Example:
include asm.inc
public example_code
.code
example_code proc
mov dl,0
call diskfree
jc disk_error
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
DISKWP: determines if a floppy disk is write-protected
Source: diskwp.asm
Call with: DL = floppy disk number (drive A: = 0)
Returns: AL = BIOS error code
0 = no error
1 = invalid disk number
3 = disk is write-protected
128 = drive not ready
Uses: AX, flags
Supports: physical drives A: and B:
Example:
include asm.inc
public mycode
extrn diskwp:proc
.code
diskwp proc
.
.
.
mov dl,1 ; drive B:
call diskwp ; can I write to this disk?
or al,al
jz no_problem
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
DOTBAK: changes the file extension of an existing file to .BAK
Source: dotbak.asm (strrchr.asm)
Call with: DS:[SI] = address of a ASCIIZ valid filename
dotbak deletes a previous .BAK file of this name and
renames the input filename.ext to filename.bak.
Returns: if CF = 0, no error
if CF = 1, AL = DOS error code. If AL = 5, the previous
.BAK filename is probably read-only. All other errors refer
to the name change operation.
Uses: AX, flags
Example:
extrn dotbak:proc
.data
disk_doc db 'DISK.DOC',0
.code
; program fragment assumes DS:@data
.
.
.
mov si,offset DGROUP:disk_doc
call dotbak
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FCLOSE: close a file managed by ASMLIB's buffered file I/O system
Source: fopen.asm ($handle.asm, allocdos.asm)
Call with: BX = file handle
The file must have been opened by FOPEN or FCREATE; If the
file is not read-only, the output buffer will be written to
the disk file before closing the file.
Returns: if CF = 0, no error
if CF = 1, AX = error code
Uses: AX, flags
Example: see FOPEN
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FCOPY: copy a file
FCOPYM: copy a file using supplied memory buffer
Source: fcopy.asm
Call with: DS:[SI] = address of source filename
ES:[DI] = address of destination filename
Both filenames must be ASCIIZ strings. Drive and path need
not be fully specified; filenames may not include * or ?
wildcards.
FCOPY only: Requires 64k DOS memory available
FCOPYM only: AX = segment address of 64k buffer
Returns: if CF = 0, no problem
if CF = 1, AX = DOS error code (AX = -1 if insufficient memory)
Uses: AX, CF
Example:
.data
db 'b:'
source db 'asmlib.lib',0 ; copy the library to b:
extrn fcopy:proc
.code
; program fragment assumes DS:@data
.
.
push ds
pop es
assume es:@data
lea si,source
mov di,si ; DI also points to source
sub di,2 ; back the pointer to the 'B:'
call fcopy
jc oops
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FCOUNT: counts the number of files matching an ASCIIZ filespec string.
The filespec string may include the '*' and '?' wildcards.
Source: fcount.asm
Call with: DS:[DX] pointing to filespec string
CX = file attributes
assumes DS:@data
Returns: AX = number of files matching the filespec string
Uses: AX, all other registers and flags are saved
Example:
.code
; program fragment assumes DS:@data
.
.
.
lea dx,filespec ; address of filespec string
xor cx,cx ; normal files only
call fcount
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FCREATE: create new file and initialize output buffer
Source: fcreate.asm ($handle.asm, allocdos.asm)
Call with: DS:[DX] pointing to ASCIIZ filename
The file is created with write-only access. If a file with
the same name already exists, it is truncated to zero
length by FCREATE.
Returns: if CF = 0, AX = file handle
if CF = 1, AX = error code
Uses: AX, flags
Example:
include asm.inc
public myprog
extrn fcreate:proc
.data
file_name db 'ANYNEW.FIL',0
file_handle dw 0
.code
myprog proc
; program fragment assumes DS:@data
.
.
.
lea dx,file_name
call fcreate
jc something_went_wrong
mov file_handle,ax ; save the handle
.
.
.
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FEXIST: determines if a file exists and can be opened with read access
Source: fexist.asm
Call with: DS:[DX] pointing to ASCIIZ filename
Returns: if CF = 0, file exists
if CF = 1, AX = MS-DOS error code
Uses: AX, CF; all other flags and registers are saved
Example:
include asm.inc
extrn fexist:proc
.data
filename db 'asmlib.doc',0
.code
; program fragment assumes DS:@data
.
.
.
lea dx,filename
call fexist
jnc got_the_file ; if CF = 0, go on
jmp doserror ; else go to error handling code
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FFLUSH: flushes the ASMLIB and DOS output buffers for specified handle
Source: fflush.asm (fseek.asm, $handle.asm)
Call with: BX = file handle
flushing the buffers guards against data loss in case of system
failure, such as power loss
Returns: if CF = 0, no error; function successful
if CF = 1, AX = DOS error code
Uses: AX, flags
Example:
include asm.inc
extrn fflush:proc
.code
; program opens file & writes to file
.
.
.
; flush the buffers to disk
mov bx,handle
call fflush
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FGET: read specified number of bytes from file buffer
Source: fget.asm ($handle.asm, $fget.asm)
Call with: BX = file handle
CX = number of bytes requested (up to 4096 bytes)
Returns: if CF = 0, AX = number of bytes read
ES:[BX] points to data in buffer
if CF = 1, AX = DOS error code
Uses: AX, BX, ES, flags
Example:
include asm.inc
extrn fopen:proc, fget:proc
.data
file_name db 'asmlib.doc',0
file_handle dw 0
.code
; program fragment assumes DS:@data
.
.
.
lea dx,file_name
call fopen
jc fopen_problem
mov file_handle,ax ; save for later
mov bx,ax ; file handle
mov cx,8 ; I want 8 bytes
call fget ; returned at ES:[BX]
jc read_problem ; uh oh, trouble ...
cmp ax,cx ; did I get what I wanted?
jne not_enough
.
.
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FGETCHR: read a character from a file buffer
Source: fgetchr.asm ($handle.asm)
Call with: BX = file handle
Returns: if CF = 0, AL = next character from file buffer
if CF = 1, AX = DOS error code
AX = 0 if at end of file
Uses: AX, flags
Example:
include asm.inc
extrn fopen:proc, fgetchr:proc
.data
file_name db 'asmlib.doc',0
file_handle dw 0
.code
; program fragment assumes DS:@data
.
.
.
lea dx,file_name
call fopen
jc fopen_problem
mov file_handle,ax ; save for later
mov bx,ax ; file handle
call fgetchr ; character in AL
jc read_problem
.
.
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FGETPOS: determine file pointer position for file managed by library
Source: fgetpos.asm ($handle.asm)
Call with: BX = file handle
Also works with file not opened by FOPEN or FCREATE.
Returns: if CF = 0, DX:AX = file pointer position
if CF = 1, AX = DOS error code
Uses: AX, DX, flags
Example:
include asm.inc
extrn fopen:proc, fgetstr:proc, fpetpos:proc
.code
; program fragment assumes DS:@data
.
.
.
; program opens file & does a variety of read & write operations
; get pointer position
mov bx,handle
call fgetpos ; get position in DX:AX
jc uh_oh
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FGETSTR: read an ASCII string from a file buffer
Source: fgetstr.asm ($handle.asm, $fget.asm)
Call with: BX = file handle
ASCII strings may be terminated with either 0Dh or 0Dh+0Ah.
After reading each string, FGetStr positions the buffer pointer
to read the next string. String length should be less than
the buffer size. See FOPEN.
Returns: if CF = 0, ES:[BX] points to string in buffer
CX = length of ASCII string
if CX = byte length of buffer, string >= size of buffer
if CF = 1, AX = DOS error code
AX = 0 if end of file
Uses: ES, BX, AX, CX, flags
Example:
include asm.inc
extrn fopen:proc, fgetstr:proc
.data
file_name db 'asmlib.doc',0
file_handle dw 0
.code
; program fragment assumes DS:@data
.
.
.
lea dx,file_name
call fopen
jc fopen_problem
mov file_handle,ax ; save for later
mov bx,ax ; file handle
call fgetstr
jc read_problem
call strndup ; make a copy in near heap for later
.
.
.
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FGETSTRR: read previous ASCII string from a file buffer
Source: fgetstr.asm ($handle.asm, $fget.asm, fgetpos.asm)
Call with: BX = file handle
ASCII strings may be terminated with either 0Dh or 0Dh+0Ah.
After reading each string, FGetStrR positions the buffer pointer
to read the previous string. String length should be less than
the buffer size. See FOPEN.
Note that FGetStrR positions the file pointer to read the next
previous string; if you call FGetStr after calling FGetStrR,
FGetStr will return the same string returned by the preceeding
FGetStrR.
Returns: if CF = 0, ES:[BX] points to string in buffer
CX = length of ASCII string
if CX = byte length of buffer, string >= size of buffer
if CF = 1, AX = DOS error code
AX = 0FFFFh if file pointer at start of file
Uses: ES, BX, AX, CX, flags
Example:
include asm.inc
extrn fopen:proc, fgetstrr:proc
.data
file_name db 'asmlib.doc',0
file_handle dw 0
.code
; program fragment assumes DS:@data
.
.
.
lea dx,file_name
call fopen
jc fopen_problem
mov file_handle,ax ; save for later
mov bx,ax ; file handle
call fgetstrr
jc read_problem ; AX = 0FFFFh if at start of file
call strndup ; make a copy in near heap for later
.
.
.
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FILELIST: creates a list of file names matching a filespec mask
Source: filelist.asm (fcount.asm, allocdos.asm)
Call with: DS:[SI] pointing to filespec mask
CX = file attribute mask
Returns: if CF = 0:
ES = base segment address of list buffer
AX = number of filenames in list
CX = list field width
if CF = 1, AX = MS-DOS error code
You should use DOS function 49h to release the file list
buffer when you're done with it.
Uses: AX, CX, ES, CF
Example:
include asm.inc
public myproc
.data
filespec db '*.*',0
.code
; program fragment assumes DS:@data
.
.
.
lea si,filespec
mov cx,16 ; normal files and subdirectories
call filelist
jc cant_do_it ; oops
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FINDDATE: given a successful call to FindFirst or FindNext, returns
the file's date stamp
Source: findfile.asm
Call with: DS:[BX] pointing to DTA buffer; assumes DS @DATA
Returns: DX = month
AX = day
CX = year
Uses: AX, CX, DX, flags
Example:
.code
; program fragment assumes DS:@data
.
.
.
lea bx,filespec
mov cx,0 ; normal files only
call findfirst ; find first matching file
jc no_more_files
cmp ax,-1
je no_more_files
call finddate
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FINDFIRST: This subroutine, when used with FindNext, finds files on
a disk which match an ASCIIZ filespec string. The filespec
string may contain the '*' and '?' wildcards.
Source: findfile.asm (heap.asm)
Call with: DS:[BX] pointing to ASCIIZ filespec string; assumes DS:@data
CX = file attribute mask
FindFirst allocates space for a local DTA buffer from the
near heap. See FindNext; also see MEMINIT.
Returns: AX = error code
-1 = insufficient memory in near heap (128 bytes required)
0 = no error
CF = 1 if no files match the filespec string
DS:[BX] -> DTA buffer if the subroutine is successful. Do not
alter the 128 bytes in the DTA buffer.
The name of the file is an ASCIIZ string at 30[BX]
The file attribute is a byte at 21[BX]
The low word of the file's size is at 26[BX]
The high word of the file's size is at 28[BX]
Uses: AX, BX, flags
Example:
.code
; program fragment assumes DS:@data
.
.
.
lea bx,filespec
mov cx,0 ; normal files only
call findfirst ; find first matching file
jc no_more_files
cmp ax,-1
je no_memory ; memory not available
; print the filename on the screen
tprint_next:
mov si,bx
add si,30 ; point to filename in DTA buffer
mov dh,count ; row value
mov dl,0 ; column 0
mov ah,12 ; color attribute - RED!
call tprint ; display the file name on the screen
inc count ; next filename on next row
call findnext ; any more matching filenames?
jnc tprint_next
no_more_files:
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FINDNEXT: finds file matching search string; use after FindFirst.
used only after a successful call to FindFirst.
Source: findfile.asm (heap.asm)
Call with: no parameters; assumes DS:@data
FindNext de-allocates the DTA buffer space after the first
unsuccessful search for a matching file.
Returns: DS:[BX] -> DTA buffer
CF = 1 if no more files match the filespec string.
Uses: BX, flags
Example: see FindFirst.
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FINDTIME: given a successful call to FindFirst or FindNext, returns
the file's time stamp
Source: findfile.asm
Call with: DS:[BX] pointing to DTA buffer; assumes DS:@data
Returns: DX = hour
AX = minute
CX = second
Uses: AX, CX, DX, flags
Example: lea bx,filespec
mov cx,0 ; normal files only
call findfirst ; find first matching file
jc no_more_files
cmp ax,-1
je no_more_files
call findtime
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FLOAD: read a file into far memory
Source: fload.asm (fsize.asm, allocdos.asm)
Call with: DS:[DX] pointing to ASCIIZ filename
Returns: if CF = 0, BX = initial segment address of memory block
DX:AX = bytes loaded from disk
if CF = 1, AX = DOS error code
Uses: AX, BX, DX, CF
Example:
include asm.inc
public test_fload
extrn fload:proc
.data
fileseg dw 0
fname db 'filename.txt',0
file_size dw 0,0
.code
test_fload proc
; program fragment assumes DS:@data
.
.
lea dx,fname
call fload ; read file into DOS memory
jc no_good ; jump if there was a problem
mov fileseg,bx ; save initial segment address
; of allocated memory
mov file_size,ax ; save file size
mov file_size+2,dx
no_good: ; return with CF = 1 if error
ret ; CF = 0 if no error
test_fload endp
end
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FOPEN: opens existing file and initializes ASMLIB buffered I/O
Source: fopen.asm (allocdos.asm, $handle.asm)
Call with: DS:[DX] pointing to name of file to be opened
AL = access mode
0 = read-only access
1 = write-only access
2 = read-write access NOT SUPPORTED YET
Returns: if CF = 0, AX = file handle
if CF = 1, AX = ASMLIB or DOS error code; file not opened
if AX = 0, insufficient DOS memory available
if AX = 0FFFFh, no handles available in ASMLIB I/O array;
change NUMBER_OF_HANDLES in $handle.asm amd re-assemble
(default = 20 handles)
Uses: AX, flags
Example:
include asm.inc
public myprog
extrn fopen:proc, fclose:proc
.data
file_name db 'ASMLIB.DOC',0
file_handle dw 0
.code
myprog proc
; program fragment assumes DS:@data
.
.
.
lea dx,file_name
xor al,al ; read-only access
call fopen
jc something_went_wrong
mov file_handle,ax ; save the handle
.
.
.
; all done with this file
mov bx,file_handle
call fclose
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FPUT: write specified number of bytes to output file buffer
Source: fput.asm ($handle.asm)
Call with: BX = file handle
ES:[DI] pointing to data to write
CX = number of bytes to write
Returns: if CF = 0, no error
if CF = 1, AX = error code
Uses: AX, flags
Example:
include asm.inc
public myproc
extrn fput:proc
extrn fputchr:proc
extrn fputcrlf:proc
.data
data1 db 'several bytes may be written at once'
data_len equ $-data1
.code
; program fragment assumes DS:@data
.
.
.
mov bx,output_handle
push ds
pop es ; ES = DS = DGROUP
assume es:DGROUP
lea di,data1 ; ES:[DI] -> data1
mov cx,data_len ; bytes to write
call fput
call fputcrlf ; write CR+LF for new line
; in ASCII text file
mov al,26 ; End-of-File byte (optional)
call fputchr
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FPUTCHR: write one character to output file buffer
Source: fputchr.asm (fput.asm)
Call with: BX = output file handle
AL = character to write
Returns: if CF = 1, AX = MS-DOS error code
if CF = 0, no error
Uses: AX, flags
Example: see FPUT
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FPUTCRLF: write CR+LF pair to output file buffer
Source: fputcrlf.asm (fput.asm)
Call with: BX = output file handle; file must have been opened by
FOPEN or FCREATE
Returns: if CF = 0, no error
if CF = 1, AX = DOS error code
Uses: AX, flags
Example: see FPUT
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FPUTSTR: write an ASCIIZ string to output buffer
Source: fpustr.asm (strlen.asm, fput.asm)
Call with: BX = file handle
ES:[DI] points to ASCIIZ string
Returns: if CF = 0, AX = bytes written
if CF = 1, AX = DOS error code
Uses: AX, flags
Example:
include asm.inc
public myproc
extrn fputstr:proc
extrn fputcrlf:proc
.data
strptr dw 0 ; pointer to string, assigned by program
.code
; program fragment assumes DS:@data
.
.
.
push ds
pop es ; ES = DS = DGROUP
assume es:DGROUP
mov bx,output_handle
mov di,strptr ; ES:[DI] -> data1
call fputstr
call fputcrlf ; write CR+LF for new line
; in ASCII text file
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FSEEK: move file pointer for a file opened by FOPEN
Source: fseek.asm ($handle.asm)
Call with: BX = file handle
AL = method code: 0 = absolute offset from start of file
1 = signed offset from current file pointer
2 = signed offset from end of file
CX:DX = dword offset
Returns: if CF = 1, AX = DOS error code
if CF = 0, DX:AX = current location of file pointer
Uses: AX, DX, flags
Example:
include asm.inc
public whoknows
extrn fopen:proc, fseek:proc
.data
file0 db 'file0.dat',0
.code
whoknows proc
; program fragment assumes DS:@data
.
.
.
mov dx,offset DGROUP:file0
mov al,1 ; write only
call fopen
jc error
xor cx,cx
mov dx,cx ; zero offset
mov al,2 ; relative to end of file
call fseek ; move pointer to end of file
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
FSIZE: determines a file's size
Source: fsize.asm
Call with: BX = valid file handle
Returns: if CF = 0, DX:AX = file size
if CF = 1, AX = MS-DOS error code
Uses: AX, DX, CF
Example:
include asm.inc
extrn fsize:proc
.data
filenam db 'ASMLIB.DOC',0 ; ASCIIZ filename
.code
.
.
.
lea dx,filenam ; point to filename
mov ax,3D00h ; MS-DOS open file function, read-only
int 21h
jc oops ; jump to error control
; else no problem - continue
mov bx,ax ; file handle in BX
call fsize
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
GOODDRIVE: determines if a drivespec is a valid DOS drive
includes RAM disks and network drives
Source: goodrive.asm
Call with: DL = drive code
0 = A:
1 = B:
2 = C:
etc.
Returns: if CF = 0, the drive is a valid DOS drive
if CF = 1, the drivespec is not valid
Uses: flags
Example:
include asm.inc
extrn gooddrive.asm
.code
.
.
.
mov dl,3 ; see if a D: drive exists on this computer
call gooddrive
jc no_good ; no D: drive
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
QFNAME: qualifies a filename
Source: qfname.asm
Call with: DS:[BX] pointing to a filename; the filename may contain
drive specification and/or complete or partial path name.
Drive specification and path name not required.
Returns: DS:[SI] pointing to the full DRIVESPEC:\PATH\FILENAME
CX = length of full filename
Note that DS:[SI] points to QFName's buffer space; the next
call to QFName will return a new filename at the same address.
Uses: SI, CX, flags
Example:
include asm.inc
.data
docs db '*.doc',0 ; search for .DOC files in current directory
.code
; program fragment assumes DS:@data
.
.
.
lea bx,docs
call qfname